#include "mainwindow.h"
#include "ui_mainwindow.h"

// 主窗口构造函数
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    // 设置UI界面
    ui->setupUi(this);
    // 创建媒体播放器对象
    player = new QMediaPlayer(this);
    // 创建视频显示窗口对象
    vw = new QVideoWidget(this);
    // 将视频输出设置为视频显示窗口
    player->setVideoOutput(vw);
    // 将视频显示窗口设置为主窗口的中心部件
    this->setCentralWidget(vw);

    // 创建音量开关动作对象
    actionVolume = new QAction(this);
    // 设置音量开关动作的图标
    actionVolume->setIcon(QIcon(":/icons/icons/volume.png"));
    // 连接音量开关动作的触发信号到槽函数
    connect(actionVolume, &QAction::triggered, [this]()
    {
        actionVolume_triggered();
    });

    // 设置初始音量为50
    player->setVolume(50);

    // 创建音量滑块对象
    volumeSlider = new QSlider(this);
    // 设置音量滑块为水平方向
    volumeSlider->setOrientation(Qt::Horizontal);
    // 设置音量滑块的范围为0到100
    volumeSlider->setRange(0, 100);
    // 设置音量滑块的固定宽度为100
    volumeSlider->setFixedWidth(100);
    // 设置初始音量为50
    volumeSlider->setValue(50);
    // 取消音量滑块的焦点策略
    volumeSlider->setFocusPolicy(Qt::NoFocus);
    // 设置音量滑块的页面步长为5
    volumeSlider->setPageStep(5);

    // 连接音量滑块的移动信号到槽函数
    connect(volumeSlider, &QSlider::sliderMoved, [this]()
    {
        volumeSliderMoved();
    });

    // 连接视频效果设置对话框的信号到主窗口的槽函数
    connect(&effects, &Effects::effectSignal, this, &MainWindow::change_effects);

    // 创建播放进度滑块对象
    slider = new QSlider(this);
    // 设置播放进度滑块为水平方向
    slider->setOrientation(Qt::Horizontal);
    // 取消播放进度滑块的焦点策略
    slider->setFocusPolicy(Qt::NoFocus);

    // 创建显示当前播放时间的标签对象
    videoTime = new QLabel(this);
    // 创建定时器对象
    timer = new QTimer(this);
    // 连接定时器的超时信号到槽函数
    connect(timer, &QTimer::timeout, this, &MainWindow::timer_alarm);
    // 启动定时器，每隔1000毫秒触发一次
    timer->start(1000);

    // 创建显示剩余播放时间的标签对象
    videoTimeLeft = new QLabel(this);
    // 连接定时器的超时信号到槽函数
    connect(timer, &QTimer::timeout, this, &MainWindow::time_left);

    // 创建全屏操作动作对象
    actionFullScreen = new QAction(this);
    // 设置全屏操作动作的图标
    actionFullScreen->setIcon(QIcon(":/icons/icons/full-screen-button.png"));
    // 连接全屏操作动作的触发信号到槽函数
    connect(actionFullScreen, &QAction::triggered, [this]()
    {
        actionFullScreen_triggered();
    });

    // 将当前播放时间标签添加到主工具栏
    ui->mainToolBar->addWidget(videoTime);
    // 将播放进度滑块添加到主工具栏
    ui->mainToolBar->addWidget(slider);
    // 将剩余播放时间标签添加到主工具栏
    ui->mainToolBar->addWidget(videoTimeLeft);
    // 将音量开关动作添加到主工具栏
    ui->mainToolBar->addAction(actionVolume);
    // 将音量滑块添加到主工具栏
    ui->mainToolBar->addWidget(volumeSlider);
    // 将全屏操作动作添加到主工具栏
    ui->mainToolBar->addAction(actionFullScreen);

    // 连接音量滑块的值改变信号到媒体播放器的设置音量函数
    connect(volumeSlider,&QSlider::valueChanged, player,&QMediaPlayer::setVolume);

    // 连接媒体播放器的时长改变信号到播放进度滑块的设置最大值函数
    connect(player, &QMediaPlayer::durationChanged, slider, &QSlider::setMaximum);
    // 连接媒体播放器的播放位置改变信号到播放进度滑块的设置值函数
    connect(player, &QMediaPlayer::positionChanged, slider, &QSlider::setValue);
    // 连接播放进度滑块的移动信号到媒体播放器的设置播放位置函数
    connect(slider, &QSlider::sliderMoved, player, &QMediaPlayer::setPosition);

    // 弹出文件选择对话框，选择视频文件
    QString filename = QFileDialog::getOpenFileName(this, "Open a File", "", "Video File(*.avi, *.mpg, *.mp4)");
    // 设置媒体播放器的播放文件
    player->setMedia(QUrl::fromLocalFile(filename));
    // 触发播放/暂停操作
    on_actionPlayPause_triggered();

    // 设置主窗口的标题
    this->setWindowTitle("My-videoplayer");

    // 如果未选择文件，退出程序
    if(filename.isNull())
        exit(EXIT_FAILURE);
}

// 主窗口析构函数
MainWindow::~MainWindow()
{
    // 释放当前播放时间标签的内存
    delete videoTime;
    // 释放播放进度滑块的内存
    delete slider;
    // 释放剩余播放时间标签的内存
    delete videoTimeLeft;
    // 释放音量开关动作的内存
    delete actionVolume;
    // 释放音量滑块的内存
    delete volumeSlider;
    // 释放全屏操作动作的内存
    delete actionFullScreen;
    // 释放定时器的内存
    delete timer;
    // 释放UI界面的内存
    delete ui;
}

// 处理打开文件操作的槽函数
void MainWindow::on_actionOpen_triggered()
{
    // 弹出文件选择对话框，选择视频文件
    QString filename = QFileDialog::getOpenFileName(this, "Open a File", "", "Video File(*.avi, *.mpg, *.mp4)");
    // 触发播放/暂停操作
    on_actionPlayPause_triggered();
    // 如果选择了文件
    if(!filename.isNull()){
        // 设置媒体播放器的播放文件
        player->setMedia(QUrl::fromLocalFile(filename));
    }
    // 触发播放/暂停操作
    on_actionPlayPause_triggered();
}

// 播放视频的函数
void MainWindow::play_video()
{
    // 开始播放视频
    player->play();
    // 设置播放/暂停按钮的图标为暂停图标
    ui->actionPlayPause->setIcon(QIcon(":/icons/icons/noun_pause_64198.png"));
}

// 暂停视频的函数
void MainWindow::pause_video()
{
    // 暂停播放视频
    player->pause();
    // 设置播放/暂停按钮的图标为播放图标
    ui->actionPlayPause->setIcon(QIcon(":/icons/icons/noun_play_64196.png"));
}

// 处理播放/暂停操作的槽函数
void MainWindow::on_actionPlayPause_triggered()
{
    // 切换播放状态
    playing = !playing;
    // 根据播放状态调用播放或暂停函数
    playing ? play_video() : pause_video();
}

// 处理停止操作的槽函数
void MainWindow::on_actionStop_triggered()
{
    // 设置播放状态为暂停
    playing = false;
    // 设置播放/暂停按钮的图标为播放图标
    ui->actionPlayPause->setIcon(QIcon(":/icons/icons/noun_play_64196.png"));
    // 停止播放视频
    player->stop();
}

// 处理视频效果设置操作的槽函数
void MainWindow::on_actionEffects_triggered()
{
    // 设置播放状态为暂停
    playing = false;
    // 暂停播放视频
    player->pause();
    // 设置播放/暂停按钮的图标为播放图标
    ui->actionPlayPause->setIcon(QIcon(":/icons/icons/noun_play_64196.png"));
    // 设置视频效果设置对话框为模态对话框
    effects.setModal(true);
    // 显示视频效果设置对话框
    effects.exec();
}

// 处理视频效果设置的槽函数
void MainWindow::change_effects()
{
    // 设置视频显示窗口的亮度
    vw->setBrightness(effects.brightness);
    // 设置视频显示窗口的对比度
    vw->setContrast(effects.contrast);
    // 设置视频显示窗口的色调
    vw->setHue(effects.hue);
    // 设置视频显示窗口的饱和度
    vw->setSaturation(effects.saturation);
}

// 处理快退操作的槽函数
void MainWindow::on_actionrewindAction_triggered()
{
    // 将播放位置向前移动10000毫秒
    player->setPosition(player->position() - 10000);
}

// 处理快进操作的槽函数
void MainWindow::on_actionfastForwardAction_triggered()
{
    // 将播放位置向后移动10000毫秒
    player->setPosition(player->position() + 10000);
}

// 处理音量开关操作的槽函数
void MainWindow::actionVolume_triggered()
{
    // 如果当前音量大于0
    if(player->volume() > 0)
    {
        // 记录当前音量
        previousVolume = player->volume();
        // 将音量设置为0
        player->setVolume(0);
        // 将音量滑块的值设置为0
        volumeSlider->setValue(0);
    }
    // 如果当前音量小于等于0
    else if(player->volume() <= 0)
    {
        // 将音量恢复到之前记录的值
        player->setVolume(previousVolume);
        // 将音量滑块的值设置为之前记录的值
        volumeSlider->setValue(previousVolume);
    }
    // 处理音量滑块移动的槽函数
    volumeSliderMoved();
}

// 处理音量滑块移动的槽函数
void MainWindow::volumeSliderMoved()
{
    // 如果音量滑块的值小于等于0
    if(volumeSlider->value() <= 0)
        // 设置音量开关动作的图标为静音图标
        actionVolume->setIcon(QIcon(":/icons/icons/volume_mute.png"));
    // 如果音量滑块的值小于50
    else if(volumeSlider->value() < 50)
        // 设置音量开关动作的图标为低音量图标
        actionVolume->setIcon(QIcon(":/icons/icons/volume_low.png"));
    // 如果音量滑块的值大于等于50
    else if(volumeSlider->value() >= 50)
        // 设置音量开关动作的图标为正常音量图标
        actionVolume->setIcon(QIcon(":/icons/icons/volume.png"));
}

// 处理全屏操作的槽函数
void MainWindow::actionFullScreen_triggered()
{
    // 如果当前不是全屏状态
    if(!fullscreen)
    {
        // 将窗口设置为全屏状态
        this->setWindowState(Qt::WindowMaximized);
        // 设置全屏状态标志为true
        fullscreen = true;
    }
    // 如果当前是全屏状态
    else if(fullscreen)
    {
        // 将窗口设置为最小化状态
        this->setWindowState(Qt::WindowMinimized);
        // 设置全屏状态标志为false
        fullscreen = false;
    }
}

// 定时器触发的槽函数，用于更新播放时间显示
void MainWindow::timer_alarm()
{
    // 获取当前播放位置
    qint64 position = player->position();
    // 计算当前播放的秒数
    int seconds = (position/1000) % 60;
    // 计算当前播放的分钟数
    int minutes = (position/60000) % 60;
    // 计算当前播放的小时数
    int hours = (position/3600000) % 24;

    // 创建时间对象
    QTime time(hours, minutes, seconds);
    // 设置当前播放时间标签的文本
    videoTime->setText(time.toString());
}

// 定时器触发的槽函数，用于更新剩余时间显示
void MainWindow::time_left()
{
    // 计算剩余播放时间
    qint64 timeleft = player->duration() - player->position();
    // 计算剩余播放的秒数
    int seconds = (timeleft/1000) % 60;
    // 计算剩余播放的分钟数
    int minutes = (timeleft/60000) % 60;
    // 计算剩余播放的小时数
    int hours = (timeleft/3600000) % 24;

    // 创建时间对象
    QTime time(hours, minutes, seconds);
    // 设置剩余播放时间标签的文本
    videoTimeLeft->setText(time.toString());
}

// 处理键盘按键事件的槽函数
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    // 如果按下的是空格键
    if(event->key() == Qt::Key_Space)
        // 触发播放/暂停操作
        on_actionPlayPause_triggered();
}
